﻿using System;

namespace Tszy.Unlimited.Data.AdoNet.Sql.Descriptors
{
    /// <summary>
    /// 比较表达式描述器。
    /// </summary>
    public interface IWhereComparisonExpressionDescriptor
    {
        /// <summary>
        /// 左边参数。
        /// </summary>
        WhereComparisonExpressionParameter Left { get; }

        /// <summary>
        /// 右边参数。
        /// </summary>
        WhereComparisonExpressionParameter Right { get; }

        /// <summary>
        /// 比较符。
        /// </summary>
        string ComparisonDescriptor { get; }
    }

    /// <summary>
    /// 默认比较表达式描述器。
    /// </summary>
    public class WhereComparisonExpressionDescriptor : IWhereComparisonExpressionDescriptor
    {
        /// <summary>
        /// 左边参数。
        /// </summary>
        public WhereComparisonExpressionParameter Left { get; set; }

        /// <summary>
        /// 右边参数。
        /// </summary>
        public WhereComparisonExpressionParameter Right { get; set; }

        /// <summary>
        /// 比较符。
        /// </summary>
        public string ComparisonDescriptor { get; set; }
    }

    /// <summary>
    /// 比较表达式参数。
    /// </summary>
    public class WhereComparisonExpressionParameter
    {
        /// <summary>
        /// 参数类型。
        /// </summary>
        /// <remarks>
        /// 是 SQL 参数还是比较的结果值。
        /// </remarks>
        public WhereComparisonExpressionParameterType ParmeterType { get; set; }

        /// <summary>
        /// 属性类型。
        /// </summary>
        public Type PropertyType { get; set; }

        /// <summary>
        /// 结果值。
        /// </summary>
        /// <remarks>
        /// 如果 ParmeterType 是 Parameter，这里表示的是参数名。
        /// 如果 ParmeterType 是 Value，这里表示的是实际的结果值。
        /// </remarks>
        public object ParmeterValue { get; set; }
    }

    /// <summary>
    /// 参数类型。
    /// </summary>
    public enum WhereComparisonExpressionParameterType
    {
        /// <summary>
        /// SQL 参数。
        /// </summary>
        Parameter = 0,

        /// <summary>
        /// 值。
        /// </summary>
        Value = 1,
    }
}